package br.com.tcf.ManegedBeans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.FlowEvent;

import br.com.tcf.arqConfiguracoes.buildLog;
import br.com.tcf.dao.EmpresaDao;
import br.com.tcf.dao.GrupoDao;
import br.com.tcf.dao.UsuarioDao;
import br.com.tcf.entidades.Cliente;
import br.com.tcf.entidades.Empresa;
import br.com.tcf.login.Grupo;
import br.com.tcf.login.Usuario;
import br.com.tcf.validacoes.CriptografaPassword;

@ManagedBean(name="alteraUsuariosMB")
@ViewScoped
public class AlteraUsuariosMB {
	private Usuario usuarioLogado;

	private Usuario usuario = new Usuario();
	private List<Usuario> usuarios = new ArrayList<Usuario>();
	private UsuarioDao dao;
	private String senha = "";
	private String confirmSenha = "";
	private String email;
	private String nr_telefone;
	private Cliente cliente = new Cliente();
	private Boolean sn_altera_senha;

	private Boolean sn_administrador;
	private Boolean sn_empresa;

	private EmpresaDao empresaDao;
	private Empresa empresa;
	private List<Empresa> empresas;

	private Grupo grupo = new Grupo();
	private List<Grupo> grupos;
	private GrupoDao gdao;

	private Boolean tp_usuario_empresa = false;

	@ManagedProperty(value="#{controlaAcessoMB}")
	ControlaAcessoMB controlaAcessoMB;

	@PostConstruct
	public void ini(){
		System.out.println("Criado MB");
		usuarioLogado = controlaAcessoMB.getUsuario();

		if(usuarioLogado.getSn_empresa() == true){
			dao = new UsuarioDao();

			usuario.setSn_empresa(true);
			usuario.setEmpresa(usuarioLogado.getEmpresa());

			usuarios = dao.listaUsuarioPorEmpresa(usuarioLogado.getEmpresa());
		}else if(usuarioLogado.getSn_administrador() == true){
			dao = new UsuarioDao();

			usuarios = dao.listaUsuarioNotEmpresa();

			empresaDao = new EmpresaDao();
			empresas = new ArrayList<Empresa>();

			empresas = empresaDao.buscaEmpresaAtiva();
		}

		carregaGrupos();
	}	

	@PreDestroy
	public void morreu() {
		System.out.println("Morreu UserMB");
	}	

	public void carregaGrupos() {
		gdao = new GrupoDao();

		if(usuarioLogado.getSn_administrador() == true){
			grupos = gdao.listarGrupo();
		}else if(usuarioLogado.getSn_empresa() == true){
			grupos = gdao.listarGrupoPorEmpresa(usuario.getEmpresa());
		}
	}
	
	

	public void selecionaUsuario() {
		email = usuario.getEmail();
		nr_telefone = usuario.getNr_telefone();
		sn_altera_senha = usuario.getSn_altera_senha();
		grupo = usuario.getGrupo();
		cliente=usuario.getCliente();
		empresa = usuario.getEmpresa();
	}

	public String onFlowProcess(FlowEvent event) {
		if(senha.isEmpty()) {
			return event.getNewStep();
		}
		else {
			return event.getNewStep();
		}
	}

	public void alteraSenha() {
		if(usuario == null){
			buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "Nenhum usu�rio selecionado!");
		}else{
			dao = new UsuarioDao();

			usuario.setSn_altera_senha(sn_altera_senha);
			usuario.setSenha(CriptografaPassword.makePasswrod(usuario.getCpf()+senha));

			try{
				dao.salvar(usuario);
				buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_INFO, "Sucesso! ", "Senha atualizada com sucesso!");
			}catch(Exception e){
				e.printStackTrace();
				buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "Erro ao alterar senha do usu�rio, procure o Administrador do sistema!");
			}
		}
	}

	public void selecPertEmpresa() {
		if(tp_usuario_empresa == true){
			selecionaEmpresa();
		}else{
			selecionaAdm();
		}
	}
	
	public void selecionaAdm() {
		usuario.setSn_administrador(true);
		usuario.setSn_empresa(false);
		usuario.setEmpresa(null);
		
		dao = new UsuarioDao();

		usuarios = dao.listaUsuarioNotEmpresa();
	}

	public void selecionaEmpresa() {
		usuario.setSn_empresa(true);
		usuario.setSn_administrador(false);

		dao = new UsuarioDao();

		usuarios = dao.listaUsuarioPorEmpresa(empresa);
	}


	public void atualizaUsuario() {
		if(usuario == null){
			buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "Nenhum usu�rio selecionado!");
		}else{
			dao = new UsuarioDao();

			if(!usuario.getEmail().equals(email)){			
				if(email.equals("") || email.isEmpty()){
					buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "Email do Usu�rio n�o pode estar em branco!");
				}else{
					usuario.setEmail(email);
				}
			}
			if(!usuario.getNr_telefone().equals(nr_telefone)){
				if(nr_telefone.equals("") || nr_telefone.isEmpty()){
					buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "N�mero de telefone do Usu�rio n�o pode estar em branco!");
				}else{
					usuario.setNr_telefone(nr_telefone);
				}
			}
			if(!usuario.getGrupo().equals(grupo)){
				usuario.setGrupo(grupo);
			}

			try{
				cliente=usuario.getCliente();
				cliente.setNm_cliente(usuario.getNm_usuario());
				cliente.setNr_telefone(usuario.getNr_telefone());
				cliente.setCep(usuario.getCpf());
				cliente.setCidade(usuario.getCidade());
				usuario.setCliente(cliente);
				dao.mergeUsuario(usuario);
				buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_INFO, "Sucesso! ", "Usu�rio atualizado com sucesso!");
			}catch(Exception e){
				e.printStackTrace();
				buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "Erro ao tentar atualizar usu�rio, procure o Administrador do sistema!");
			}
		}
	}
	//GETTERS AND SETTERS
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}
	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public List<Usuario> getUsuarios() {
		return usuarios;
	}
	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
	public Empresa getEmpresa() {
		return empresa;
	}
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	public List<Empresa> getEmpresas() {
		return empresas;
	}
	public void setEmpresas(List<Empresa> empresas) {
		this.empresas = empresas;
	}
	public Grupo getGrupo() {
		return grupo;
	}
	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}
	public List<Grupo> getGrupos() {
		return grupos;
	}
	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getConfirmSenha() {
		return confirmSenha;
	}
	public void setConfirmSenha(String confirmSenha) {
		this.confirmSenha = confirmSenha;
	}
	public ControlaAcessoMB getControlaAcessoMB() {
		return controlaAcessoMB;
	}
	public void setControlaAcessoMB(ControlaAcessoMB controlaAcessoMB) {
		this.controlaAcessoMB = controlaAcessoMB;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getNr_telefone() {
		return nr_telefone;
	}
	public void setNr_telefone(String nr_telefone) {
		this.nr_telefone = nr_telefone;
	}
	public Boolean getSn_administrador() {
		return sn_administrador;
	}
	public void setSn_administrador(Boolean sn_administrador) {
		this.sn_administrador = sn_administrador;
	}
	public Boolean getSn_empresa() {
		return sn_empresa;
	}
	public void setSn_empresa(Boolean sn_empresa) {
		this.sn_empresa = sn_empresa;
	}
	public Boolean getSn_altera_senha() {
		return sn_altera_senha;
	}
	public void setSn_altera_senha(Boolean sn_altera_senha) {
		this.sn_altera_senha = sn_altera_senha;
	}
	public Boolean getTp_usuario_empresa() {
		return tp_usuario_empresa;
	}
	public void setTp_usuario_empresa(Boolean tp_usuario_empresa) {
		this.tp_usuario_empresa = tp_usuario_empresa;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
}